package com.ybt.communicate.core;

import com.ruleengine.context.IWorkflowConext;
import com.ybt.communicate.core.callback.IConnectionCallback;
import com.ybt.communicate.core.exception.ProtocolException;

/**
 * 连接器用于和第三方系统进行通信时，收发数据使用.
 * </br>发送数据分为阻塞和非阻塞两种模式.
 * @author AB033862
 * Jul 24, 2012
 */
public interface IConnection {
    /**
     *  阻塞方式发送数据.
     *  </br>调用该方法发送数据后，如果该调用需要接收响应数据，
     *  </br>那么发送线程阻塞，知道对方返回响应结果。
     * @param context 工作流Context
     * @param data 发送数据对象
     * @return 响应结果
     *      如果没有响应结果，则返回null
     * @throws ProtocolException
     */
    public Object send(IWorkflowConext context, Object data)throws ProtocolException;
    
    /**
     * 接收数据.
     * @return 接收到的数据对象
     * @throws ProtocolException
     */
    public Object receive()throws ProtocolException;

    /**
     * 关闭连接.
     * @throws ProtocolException
     */
    public void close()throws ProtocolException;

    /**
     * 返回对应协议的id.
     * @throws ProtocolException
     */
    public String getProtocolId();
    
    /**
     * 非阻塞方式发送数据.
     * </br>调用该方法发送数据后，此方法立即返回。
     *  </br>当收到对方响应结果时，会执行回调方法。
     * @param context 工作流Context
     * @param data 发送数据对象
     * @param callBack 回调方法
     * @throws ProtocolException
     */
    public void sendNonBlocking(IWorkflowConext context, Object data, IConnectionCallback callBack)throws ProtocolException;
    
    
}
